5 最长回文子串 ⌚️
> Last Format Time:7/9/2026 23:46:20
6/12/26 【标签写法避免被解析为 H1】 原内容:#双指针
问题分析
你的 while 条件中使用了 l > 0 和 r < n - 1:
while (s[l] === s[r] && l > 0 && r < n - 1) { ... }
越界/漏判问题
l > 0 意味着当 l == 0 时就会停止循环,导致无法检查索引为 0 的位置;同理 r < n - 1 导致无法检查最后一个字符。正确的边界应该是 l >= 0 和 r < n。
短路求值风险
将 s[l] === s[r] 放在最前面是不安全的。当 l 或 r 越界时,JavaScript 会抛出 Cannot read properties of undefined 的错误。必须把边界检查放在字符比较的前面。
修正后的完整代码
/**
* @param {string} s
* @return {string}
*/
var longestPalindrome = function (s) {
let maxLen = 0
let ans = ''
if (s.length === 0) return ans
if (s.length === 1) return s
const n = s.length
for (let i = 0; i < n; i++) {
let l = i
let r = i
while (l >= 0 && r < n && s[l] === s[r]) {
l--
r++
}
if (maxLen < r - l - 1) {
maxLen = r - l - 1
ans = s.slice(l + 1, r)
}
}
for (let i = 0; i < n; i++) {
let l = i
let r = i + 1
while (l >= 0 && r < n && s[l] === s[r]) {
l--
r++
}
if (maxLen < r - l - 1) {
maxLen = r - l - 1
ans = s.slice(l + 1, r)
}
}
return ans
};